module ecs{
    export class  EntityList {
        public Scene: Scene;
        /** 添加到场景的实体列表 */
        private _entities: FastList<Entity> = new FastList<Entity>();
        /** 在此框架中添加的实体的列表。 用于对实体进行分组，以便我们可以同时处理它们 */
        private _entitiesToAdd: Array<Entity> = [];
        /** 标记为要删除此框架的实体的列表。 用于对实体进行分组，以便我们可以同时处理它们 */
        private _entitiesToRemove: Array<Entity> = [];
        /** 用于updateLists以加倍缓冲，以便可以在其他地方修改原始列表 */
        private _tempEntityList: Array<Entity> = [];
        /** 通过标签跟踪实体以便于检索 */
        private _entityDict: {[key: number]: FastList<Entity>} = {};
        private _unsortedTags: Array<number> = [];

        constructor(scene: Scene){
            this.Scene = scene;
        }

        /** 检查以查看Entity当前是否由此EntityList管理 */
        public Contains(entity: Entity){
            return this._entities.Contains(entity) || this._entitiesToAdd.indexOf(entity) != -1;
        }

        public UpdateLists(){
            if (this._entitiesToRemove.length > 0){
                var result = Utils.Swap(this._entitiesToRemove, this._tempEntityList);
                this._entitiesToRemove = result[0];
                this._tempEntityList = result[1];

                for (var entity in this._tempEntityList){
                    
                }
            }

            if (this._entitiesToAdd.length > 0){

            }
        }

        /** 将实体添加到列表。 所有生命周期方法将在下一帧中调用。 */
        public Add(entity: Entity){
            this._entitiesToAdd.push(entity);
        }

        public RemoveFromTagList(entity: Entity){
            let list: FastList<Entity> = this._entityDict[entity.Tag];
            if (list){
               list.Remove(entity);
            }
        }

        public AddToTagList(entity: Entity){
            let list: FastList<Entity> = this.GetTagList(entity.Tag);
            if (!list.Contains(entity)){
                list.Add(entity);
                this._unsortedTags.push(entity.Tag);
            }
        }

        private GetTagList(tag: number){
            let list: FastList<Entity> = this._entityDict[tag];
            if (!list){
                list = new FastList<Entity>();
                this._entityDict[tag] = list;
            }
            
            return this._entityDict[tag];
        }

        public Update(){
            for (var i = 0; i < this._entities.Length; i ++){
                var entity = this._entities.Buffer[i];
                if (entity.Enabled && (entity.UpdateInterval == 1 || Time.FrameCount % entity.UpdateInterval == 0)){
                    entity.Update();
                }
            }
        }
    }
}